package k8s_agent

import (
	devstar_devcontainer_models "code.gitea.io/gitea/models/devstar_devcontainer"
	devcontainer_k8s_agent_module "code.gitea.io/gitea/modules/devstar_devcontainer/k8s_agent"
	devcontainer_dto "code.gitea.io/gitea/modules/devstar_devcontainer/k8s_agent/dto"
	devcontainer_errors "code.gitea.io/gitea/modules/devstar_devcontainer/k8s_agent/errors"
	"code.gitea.io/gitea/modules/setting"
	"context"
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// 补充笔记： modules/ 与 services/ 两个目录中的 k8s Agent 区别是什么？
//    - modules/ 与 k8s API Server 交互密切相关
//    - services/ 进行了封装，简化用户界面使用

func AssignDevcontainerDeletion2K8sOperator(ctx *context.Context, devcontainersList *[]devstar_devcontainer_models.DevstarDevcontainer) error {

	// 1. 获取 Dynamic Client
	client, err := devcontainer_k8s_agent_module.GetKubernetesClient(ctx)
	if err != nil {
		// 层层返回错误，结束数据库事务
		return err
	}

	// 2. 调用 modules 层 k8s Agent，执行删除资源
	opts := &devcontainer_dto.DeleteDevcontainerOptions{
		DeleteOptions: metav1.DeleteOptions{},
		Namespace:     setting.Devstar.Devcontainer.Namespace,
	}
	if devcontainersList == nil || len(*devcontainersList) == 0 {
		return devcontainer_errors.ErrOperateDevcontainer{
			Action:  fmt.Sprintf("Delete DevContainer in namespace '%s'", opts.Namespace),
			Message: "The DevContainer List is empty",
		}
	}
	// 遍历列表删除 DevContainer，如果删除出错，交由 module 层打印日志，交由管理员手动处理
	for _, devcontainer := range *devcontainersList {
		opts.Name = devcontainer.Name
		_ = devcontainer_k8s_agent_module.DeleteDevcontainer(ctx, client, opts)
	}
	return nil
}
